package cl.pelu.bpro;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import cl.pelu.dao.PeluIbatisDao;
import cl.pelu.main.PeluqueriaApp;
import cl.pelu.model.bo.dvo.BoletaBO;
import cl.pelu.model.bo.dvo.BoletaDVO;
import cl.pelu.model.bo.dvo.ClienteDVO;
import cl.pelu.model.bo.dvo.DetalleBO;
import cl.pelu.model.bo.dvo.DetalleDVO;
import cl.pelu.model.bo.dvo.FormulaBO;
import cl.pelu.model.bo.dvo.FormulaDVO;
import cl.pelu.model.bo.dvo.ServicioBO;
import cl.pelu.model.bo.dvo.ServicioDetalleBO;
import cl.pelu.model.bo.dvo.ServicioDVO;
import cl.pelu.model.bo.dvo.TablaDVO;
import cl.pelu.model.bo.dvo.TipoCabelloDVO;
import cl.pelu.utils.PeluFacade;

public class PeluBusinessImpl implements PeluBusiness{
	
	
	PeluIbatisDao peluIbatisDao;
	
	
	public void setpeluIbatisDaoImpl(PeluIbatisDao peluIbatisDao){
		this.peluIbatisDao = peluIbatisDao; 
	}

	
	public TablaDVO[] getBases() throws SQLException{
		List lista = peluIbatisDao.getBases();
		return (TablaDVO[])lista.toArray(new TablaDVO[lista.size()] );
		
	}
	
	public TablaDVO[] getGramos() throws SQLException{
		List lista = peluIbatisDao.getGramos();
		return (TablaDVO[])lista.toArray(new TablaDVO[lista.size()] );
	}
	
	public TablaDVO[] getOxidante() throws SQLException{
		List lista = peluIbatisDao.getOxidante();
		return (TablaDVO[])lista.toArray(new TablaDVO[lista.size()] );
	}
	
	public TablaDVO[] getMatiz() throws SQLException{
		List lista = peluIbatisDao.getMatiz();
		return (TablaDVO[])lista.toArray(new TablaDVO[lista.size()] );
	}
	
	public TablaDVO[] getGramosMatiz() throws SQLException{
		List lista = peluIbatisDao.getGramosMatiz();
		return (TablaDVO[])lista.toArray(new TablaDVO[lista.size()] );
	}
	
	
	public TablaDVO[] getTipoCabello() throws SQLException
	{
		List lista = peluIbatisDao.getTipoCabello();
		return (TablaDVO[])lista.toArray(new TablaDVO[lista.size()] );
	}
	
	public TablaDVO[] getServicio() throws SQLException
	{
		return peluIbatisDao.getServicio();
		
	}
	
	public int getPrecioByNombreTipoCabello(String nombreServicio ,  String tipoCabello) throws SQLException{
		return peluIbatisDao.getPrecioByNombreTipoCabello(nombreServicio,tipoCabello); 
	}
	
	public void insertBoleta(BoletaDVO boleta) throws SQLException{
		peluIbatisDao.insertBoleta(boleta);
	}


	@Override
	public int insertDetalle(DetalleDVO detalle) throws SQLException {
		return peluIbatisDao.insertDetalle(detalle);
	}


	@Override
	public int insertFormula(FormulaDVO formula) throws SQLException {
		return peluIbatisDao.insertFormula(formula);
	}
	
	
	public void guardarBoleta(BoletaBO boleta) throws SQLException{
	
		
		try {
			
				peluIbatisDao.getSqlMapClient().startTransaction();
				
				BoletaDVO boletaDVO = new BoletaDVO();
				boletaDVO.setId(boleta.getNumeroBoleta());
				boletaDVO.setDescuento(boleta.getMontoDescuento());
				boletaDVO.setFecha(boleta.getFecha());
				boletaDVO.setObservacion(boleta.getObservaciones());
				
				ClienteDVO cliente = boleta.getCliente();
				if(cliente.getRut().length()>0){
					boletaDVO.setRut(cliente.getRut());
				}else{
					boletaDVO.setRut(null);
				}
				
				
				boletaDVO.setSubTotal(boleta.getSubtotal());
				boletaDVO.setTotal(boleta.getTotal());
		 
				peluIbatisDao.insertBoleta(boletaDVO);
				
				
				
						
				ArrayList<ServicioDetalleBO> servicio = boleta.getServiciosList();
				for (ServicioDetalleBO servicioDVO : servicio) {
				
					DetalleDVO detalleDVO =new DetalleDVO();
					detalleDVO.setCantidad(servicioDVO.getCantidad());
					detalleDVO.setNumeroBoleta(boleta.getNumeroBoleta());
					detalleDVO.setValorUnitario(servicioDVO.getPrecioUnitario() );
					detalleDVO.setValorVenta(servicioDVO.getValorVenta());
					
					
					detalleDVO.setServicioId(
							peluIbatisDao.getIdServicioByNombreTipoCabello(
									servicioDVO.getNombre().getNombre(),servicioDVO.getTipoCabello().getNombre() ));
				
					
					int idDetalle = peluIbatisDao.insertDetalle(detalleDVO);
					System.out.println(idDetalle);	
					
					ArrayList<FormulaBO> formulaList = servicioDVO.getFormula();
					
					for (FormulaBO formulaBO : formulaList) {
						
						FormulaDVO formula = new FormulaDVO();
						formula.setBaseId( formulaBO.getBase().getIdentificador());
						formula.setDetalleId( idDetalle);
						formula.setGramosId( formulaBO.getGramos().getIdentificador());
						formula.setGramosMatizId( formulaBO.getGramosMatiz().getIdentificador());
						formula.setMatizId( formulaBO.getMatiz().getIdentificador());
						formula.setOxidanteId( formulaBO.getOxidante().getIdentificador());
				
						peluIbatisDao.insertFormula(formula);
					}
				}
					
					
				
				
			peluIbatisDao.getSqlMapClient().commitTransaction();
			
	        } catch (SQLException ex) {
	         	   throw new SQLException(ex);

	        } finally {
	        
	        	peluIbatisDao.getSqlMapClient().endTransaction();
	             
	        
	        }
		
		
	}


	@Override
	public int getIdUltimaBoleta() throws SQLException {
		
		return peluIbatisDao.getIdUltimaBoleta();
	}


	@Override
	public BoletaDVO getBoletaById(int id) throws SQLException {
		return peluIbatisDao.getBoletaById(id);
	}




	public BoletaDVO[] getBoletaByFechas(Date fechaDesde , Date fechaHasta) throws SQLException{
		
		return peluIbatisDao.getBoletaByFechas(fechaDesde, fechaHasta);
	}
	
	
	
	
	public ServicioBO[] getServicios(ServicioDVO servicio) throws SQLException{
		return peluIbatisDao.getServicios(servicio);
		
	}
	
	public int insertServicio(ServicioDVO servicio) throws SQLException {
		return peluIbatisDao.insertServicio(servicio);
	}
	
	public void updateServicio(ServicioDVO servicio) throws SQLException {
		 peluIbatisDao.updateServicio(servicio);
	}
	
	public int guardarServicio(ServicioDVO servicio) throws SQLException{
		
		int retorno = 0;
		
		ServicioDVO servicioDVO = peluIbatisDao.getServiciosByNombre(servicio.getNombre());
		
		
		if(servicioDVO == null)
		{
			peluIbatisDao.insertServicio(servicio);
		}
		else
		{
			servicioDVO.setTipoCabelloId(servicio.getTipoCabelloId());
			servicioDVO.setValor(servicio.getValor());
			peluIbatisDao.updateServicio(servicio);
		}
		
		
		return retorno;
	}
	
	
	public void deleteServicioById(int id) throws SQLException {
		peluIbatisDao.deleteServicioById(id);
	}
	
	public TipoCabelloDVO[] getTipoCabelloByNombre(String nombre) throws SQLException {
		return  peluIbatisDao.getTipoCabelloByNombre(nombre); 
	}
	
	public int getPrecioByNombre(String nombre) throws SQLException {
		return  peluIbatisDao.getPrecioByNombre(nombre);
	}
	
	public int isFormulaByNombre(String nombre) throws SQLException{
		return  peluIbatisDao.isFormulaByNombre(nombre);
	}
	public int isFormulaByNombreTipoCabello(String nombreServicio ,  String tipoCabello) throws SQLException{
		return  peluIbatisDao.isFormulaByNombreTipoCabello(nombreServicio, tipoCabello);
	}

	
	@Override
	public void eliminarBoleta(int id) throws SQLException {
		if(peluIbatisDao.getBoletaById(id) != null){
			
			BoletaDVO bol = peluIbatisDao.getBoletaById(id);
			
			if(peluIbatisDao.getDetalleByBolId(bol.getId())!= null){
				DetalleDVO[] detalleDVO = peluIbatisDao.getDetalleByBolId(id);
				for (int i = 0; i < detalleDVO.length; i++) {
					peluIbatisDao.deleteFormulaByDetId(detalleDVO[i].getId());
				}
			}
			peluIbatisDao.deleteDetalleByBolId(id);
			peluIbatisDao.deleteBoletaById(id);
		
		}
	}
	
	
	public BoletaBO getBoletaBObyId(int id) throws SQLException{
		
		
	 	BoletaBO boleta = new BoletaBO();
		BoletaDVO boletaDVO = peluIbatisDao.getBoletaById(id);

		boleta.setNumeroBoleta(boletaDVO.getId());
		boleta.setMontoDescuento(boletaDVO.getDescuento());
		boleta.setFecha(boletaDVO.getFecha());

		
		boleta.setPorcentajeDescuento(boletaDVO.getPorcentajeDescuento());
		boleta.setSubtotal(boletaDVO.getSubTotal());
		boleta.setTotal(boletaDVO.getTotal());
		boleta.setObservaciones(boletaDVO.getObservacion());
		
		ClienteDVO cliente = peluIbatisDao.getClientesByRut(boletaDVO.getRut());
		
		if(cliente !=null){
			boleta.setCliente(cliente);
		}else{
			
		}
		
		
		DetalleDVO[] detalleDVO =	peluIbatisDao.getDetalleByBolId(id);
	 	
	 	ArrayList<ServicioDetalleBO> detalleArray = new ArrayList<ServicioDetalleBO>(); 
	 	for (DetalleDVO detalleDVO2 : detalleDVO) {
	 		
	 		ServicioDetalleBO servicioDetalleBO = new ServicioDetalleBO ();
	 		ServicioDVO servicio = peluIbatisDao.getServicioById(detalleDVO2.getServicioId());
	 		servicioDetalleBO.setNombre(new TablaDVO(servicio.getId(),servicio.getNombre()));
	 		servicioDetalleBO.setCantidad(detalleDVO2.getCantidad());
	 		servicioDetalleBO.setPrecioUnitario(detalleDVO2.getValorUnitario());
	 		servicioDetalleBO.setValorVenta(detalleDVO2.getValorVenta());
	 		
	 		
	 		ServicioDVO servicioDVO = peluIbatisDao.getServicioById(detalleDVO2.getServicioId());

	 		if(servicioDVO!=null){
	 			TipoCabelloDVO tc = new TipoCabelloDVO();
		 		tc.setId(servicioDVO.getTipoCabelloId());
		 		tc.setNombre(peluIbatisDao.getTipoCabelloById(servicioDVO.getTipoCabelloId()).getNombre());
		 		servicioDetalleBO.setTipoCabello(tc);
	 		}else{
	 			servicioDetalleBO.setTipoCabello(new TipoCabelloDVO());
	 		}
	 		
	 		
		 	FormulaDVO[] formulaDVO =	peluIbatisDao.getFormulaByDetId(detalleDVO2.getId());
		 	for (FormulaDVO formulaDVO2 : formulaDVO) {
		 		FormulaBO formulaBO = new FormulaBO();
		 		
		 		formulaBO.setBase(peluIbatisDao.getBaseById(formulaDVO2.getBaseId()));
		 		formulaBO.setOxidante(peluIbatisDao.getOxidanteById(formulaDVO2.getOxidanteId()));
		 		formulaBO.setMatiz(peluIbatisDao.getMatizById(formulaDVO2.getMatizId()));
		 		formulaBO.setGramosMatiz(peluIbatisDao.getGramosMatizById(formulaDVO2.getGramosMatizId()));
		 		formulaBO.setGramos(peluIbatisDao.getGramosById(formulaDVO2.getGramosId()));
		 		
		 		servicioDetalleBO.addFormula(formulaBO);
			}
		 	detalleArray.add(servicioDetalleBO);
		 	
		}
	 	
	 	boleta.setServicioDetalleBO(detalleArray);
	 	
	 	return boleta;
	 	
	 	
	}
	
	public TablaDVO[] getServicioAgrupado() throws SQLException{
		return  peluIbatisDao.getServicioAgrupado();
	}


	@Override
	public TablaDVO getGramosById(int id) throws SQLException {
		return (TablaDVO) peluIbatisDao.getGramosById(id);
	}


	@Override
	public TablaDVO getMatizById(int id) throws SQLException {
		return (TablaDVO) peluIbatisDao.getMatizById(id);
	}


	@Override
	public TablaDVO getOxidanteById(int id) throws SQLException {
		return (TablaDVO) peluIbatisDao.getOxidanteById(id);	
	}


	@Override
	public TablaDVO getGramosMatizById(int id) throws SQLException {
		return (TablaDVO) peluIbatisDao.getGramosMatizById(id);
	}


	@Override
	public TablaDVO getTipoCabelloById(int id) throws SQLException {
		return (TablaDVO) peluIbatisDao.getTipoCabelloById(id);
	}


	@Override
	public ArrayList <ClienteDVO> getClientes(ClienteDVO cliente) throws SQLException{

		return  peluIbatisDao.getClientes(cliente);
	}


	@Override
	public ClienteDVO getClientesByRut(String rut) throws SQLException {

		return (ClienteDVO) peluIbatisDao.getClientesByRut(rut);
	}


	@Override
	public void eliminarClientesByRut(String rut) throws SQLException{
		
		peluIbatisDao.eliminarClientesByRut(rut);
	}


	@Override
	public void updateClienteByRut(ClienteDVO cliente) throws SQLException {
		peluIbatisDao.updateClienteByRut(cliente);
		
	}


	@Override
	public int insertCliente(ClienteDVO cliente) throws SQLException {
		return peluIbatisDao.insertCliente(cliente);
	}
	
	
public void actualizarBoleta(BoletaBO boleta) throws SQLException{
	
	
	
		
		try {
			
				peluIbatisDao.getSqlMapClient().startTransaction();
				
				this.eliminarBoleta(boleta.getNumeroBoleta());
				
				BoletaDVO boletaDVO = new BoletaDVO();
				boletaDVO.setId(boleta.getNumeroBoleta());
				boletaDVO.setDescuento(boleta.getMontoDescuento());
				boletaDVO.setFecha(boleta.getFecha());
				boletaDVO.setObservacion(boleta.getObservaciones());
				
				ClienteDVO cliente = boleta.getCliente();
				if(cliente.getRut().length()>0){
					boletaDVO.setRut(cliente.getRut());
				}else{
					boletaDVO.setRut(null);
				}
				
				
				boletaDVO.setSubTotal(boleta.getSubtotal());
				boletaDVO.setTotal(boleta.getTotal());
		 
				
				peluIbatisDao.insertBoleta(boletaDVO);
				
				ArrayList<ServicioDetalleBO> servicio = boleta.getServiciosList();
				for (ServicioDetalleBO servicioDVO : servicio) {
				
					DetalleDVO detalleDVO =new DetalleDVO();
					detalleDVO.setCantidad(servicioDVO.getCantidad());
					detalleDVO.setNumeroBoleta(boleta.getNumeroBoleta());
					detalleDVO.setValorUnitario(servicioDVO.getPrecioUnitario() );
					detalleDVO.setValorVenta(servicioDVO.getValorVenta());
					
					
					detalleDVO.setServicioId(peluIbatisDao.getIdServicioByNombreTipoCabello(servicioDVO.getNombre().getNombre(),servicioDVO.getTipoCabello().getNombre() ));
				
					
					int idDetalle = peluIbatisDao.insertDetalle(detalleDVO);
					System.out.println(idDetalle);	
					
					ArrayList<FormulaBO> formulaList = servicioDVO.getFormula();
					
					for (FormulaBO formulaBO : formulaList) {
						
						FormulaDVO formula = new FormulaDVO();
						formula.setBaseId( formulaBO.getBase().getIdentificador());
						formula.setDetalleId( idDetalle);
						formula.setGramosId( formulaBO.getGramos().getIdentificador());
						formula.setGramosMatizId( formulaBO.getGramosMatiz().getIdentificador());
						formula.setMatizId( formulaBO.getMatiz().getIdentificador());
						formula.setOxidanteId( formulaBO.getOxidante().getIdentificador());
				
						peluIbatisDao.insertFormula(formula);
					}
				}
					
					
				
				
			peluIbatisDao.getSqlMapClient().commitTransaction();
			
	        } catch (SQLException ex) {
	         	   throw new SQLException(ex);
	         	   

	        } finally {
	        
	        	peluIbatisDao.getSqlMapClient().endTransaction();
	             
	        }		
	    }

	     @Override
		public void eliminarDetalleBoleta(int id) throws SQLException {
				
			
				DetalleDVO[] detalleDVO = peluIbatisDao.getDetalleByBolId(id); 
			
				if(detalleDVO !=  null){
					
					for (int i = 0; i < detalleDVO.length; i++) {
						peluIbatisDao.deleteFormulaByDetId(detalleDVO[i].getId());
					}
				}
				peluIbatisDao.deleteDetalleByBolId(id);
				peluIbatisDao.deleteBoletaById(id);
			
			
		}


		@Override
		public BoletaDVO[] getBoletaByCliente(String rut) throws SQLException {
			return peluIbatisDao.getBoletaByCliente(rut);
		}
}
